#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 1000001

int n;
vector<int> G[maxn];
vector<int> rG[maxn];
vector<int> seq;
bool used[maxn];
int sccid[maxn];
int sccnum[maxn];
int next[maxn];
int dpdis[maxn];

void add_edge(int from, int to){
    G[from].push_back(to);
    rG[to].push_back(from);
}

void dfs(int u){
    used[u]=true;
    for(int i=0; i<G[u].size(); i++){
        int v = G[u][i];
        if(!used[v]) dfs(v);
    }
    seq.push_back(u);
}

void rdfs(int u, int _sccid){
    used[u]=true;
    sccid[u]=_sccid;
    for(int i=0; i<rG[u].size(); i++){
        int v = rG[u][i];
        if(!used[v]) rdfs(v,_sccid);
    }
}

int scc(){
    memset(used,0,sizeof(used));
    seq.clear();
    for(int u=1; u<=n; u++){
        if(!used[u]) dfs(u);
    }
    memset(used,0,sizeof(used));
    int _sccid = 0;
    for(int i=seq.size()-1; i>=0; i--){
        int v = seq[i];
        if(!used[v]){
            rdfs(v, _sccid);
            _sccid++;
        }
    }
    return _sccid;
}

int dfs2(int u){
    int csccid=sccid[u];
    if(sccnum[csccid]>1 || next[u]==u) return sccnum[csccid];
    if(dpdis[u]>0) return dpdis[u];
    return dpdis[u] = dfs2(next[u])+1;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int u=i,v;
        scanf("%d",&v);
        next[i]=v;
        add_edge(u,v);
    }

    int allsccnum = scc();
    for(int i=1;i<=n;i++){
        int csccid=sccid[i];
        sccnum[csccid]++;
    }
    
    for(int i=1;i<=n;i++){
        printf("%d\n",dfs2(i));
    }

    return 0;
}